package com.geqian.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.SecureRandom;
import java.util.Objects;

/**
 * @author geqian
 * @date 16:48 2022/8/31
 */
public class RandomUtils {

    private static final SecureRandom secureRandom = new SecureRandom();


    /**
     * 随机生成由数字组成的指定长度的字符串
     *
     * @param length
     * @return
     */
    public static String randomNumberStr(int length) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < length; i++) {
            stringBuilder.append(secureRandom.nextInt(10));
        }
        return stringBuilder.toString();
    }


    /**
     * 生成随机整数
     *
     * @param seed 种子
     * @return
     */
    public static Integer randomInt(Integer seed) {
        return secureRandom.nextInt(seed);
    }


    /**
     * 生成随机小数
     *
     * @param seed          种子
     * @param decimalPlaces 保留小数位数
     * @return
     */
    public static Double randomDouble(int seed, int decimalPlaces) {
        String doubleStr = formatDecimalPlaces(secureRandom.nextDouble() * seed, decimalPlaces);
        return Double.valueOf(doubleStr);
    }


    /**
     * 生成随机小数
     *
     * @param seed          种子
     * @param decimalPlaces 保留小数位数
     * @return
     */
    public static Float randomFloat(int seed, int decimalPlaces) {
        String floatStr = formatDecimalPlaces(secureRandom.nextFloat() * seed, decimalPlaces);
        return Float.valueOf(floatStr);
    }

    /**
     * 随机验证码
     *
     * @param length 生成字符串长度
     * @return
     */
    public static String randomVerificationCode(int length) {
        char[] chars = "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ".toCharArray();
        StringBuilder stringBuilder = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            int index = secureRandom.nextInt(chars.length);
            stringBuilder.append(chars[index]);
        }
        return stringBuilder.toString();
    }


    /**
     * 转换小数位数
     *
     * @param numberStr     数值字符串
     * @param decimalPlaces 保留小数位数
     * @return
     */
    private static String formatDecimalPlaces(String numberStr, int decimalPlaces) {
        Objects.requireNonNull(numberStr);
        return new BigDecimal(numberStr).setScale(decimalPlaces, RoundingMode.DOWN).toString();
    }


    /**
     * 转换小数位数
     *
     * @param number        数值
     * @param decimalPlaces 保留小数位数
     * @return
     */
    private static String formatDecimalPlaces(Number number, int decimalPlaces) {
        return formatDecimalPlaces(number.toString(), decimalPlaces);
    }
}
